﻿@{
    ViewBag.Title = "排课规则设置";
    Layout = "~/Views/Shared/___newestMaster.cshtml";
}

@using ClassModel
@using ClassBLL
@using ClassCommon
@using System.web



@{
    // 原始的taskid
    string rawTaskid = this.Request["taskid"];

    // 根据任务id获取排课节次信息
    int decodeTaskId = ViewBag.decodeTaskid;
    t_class_sections section = t_class_sections_BLL.GetSectionByTaskID(decodeTaskId);

    t_classDemo_UserInfo user = ViewBag.CurrentUser;

    int daysofweek = section.dayOfWeek; // 决定了表格的第一行列
    int amLessionCount = section.AMSections; // 表格的上半部分行
    int pmLessionCount = section.PMSections; // 表格的下半部分行

    int totalSections = (amLessionCount + pmLessionCount) * daysofweek; // 一周上多少节课

    // 
    t_class_fileupload fileupload = t_class_user_fileupalod_BLL.GetExcelFileWithTaskId(decodeTaskId, user.id);

    // 获取老师当前excel的老师数据
    // var teachers = t_class_teacher_BLL.GetTeacherListWithFileId(fileupload.id);
    // 获取课程信息
    var coureses = t_class_course_BLL.GetCourseListWithFileID(fileupload.id);
    // 获取班级的信息
    var classes = t_class_classes_BLL.GetClassListWithFileId(fileupload.id);

    int page = 0;
    int totalCount;
    // 获得老师&课程节点信息
    var bindList = t_class_teacher_BLL.GetTeachersInfoWhitFileId(fileupload.id, out totalCount, page);
    int totalPageCount = 1;
    if (totalCount > 10)
    {
        if (totalCount % 10 == 0)
        {
            totalPageCount = totalCount / 10;
        }
        else
        {
            totalPageCount = totalCount / 10 + 1;
        }
    }
    System.Web.Script.Serialization.JavaScriptSerializer jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();

    string jsonFirstItem = jsSerializer.Serialize(bindList);

    // string firstJsonItem = 

    // 获得年纪信息
    var grade = t_class_grade_BLL.GetGradeInfoWithFileId(fileupload.id);
}

@section style {
    <style type="text/css">
        .table td {
            text-align: center;
        }

        .active {
            background-color: #0d9582 !important;
            color: white !important;
        }

        .tipText {
            font-size : 16px !important;
        }
    </style>
}

<div class="gztj">
    <div class="tisp">
        <div class="conConTo1 col-lg-12 col-md-12 col-sm-12">
            <ul>
                <li>贴心tips</li>
                <li>
                    <p>注意</p>
                    <p>请设置学校的教学时间、年级/班级固定无课时间、课程/教师无固定时间以及连课堂和合班课</p>
                </li>
                <li>
                    <input type="button" name="" id="" onclick="getGenerateResult()" value="保存" /></li>
            </ul>
        </div>
        <div class="col-lg-12 col-md-12 col-sm-12" style="float: left; padding: 0;">
            <div class="pkhb col-lg-6 col-md-6 col-sm-12">
                <ul>
                    <li class="col-lg-6 col-md-6 col-sm-6 pkhbbg" style="overflow: hidden">不排课时间</li>
                    <li class="col-lg-6 col-md-6 col-sm-6 hb">合班</li>
                </ul>
            </div>
        </div>

        <div class="bigbrow">
            <div class="pkLeft col-lg-4 col-md-4 col-sm-12">
                <select name="" id="unScheduleRuleTypeSlt">
                    <option value="class">班级不排课时间</option>
                    <option value="course">课程不排课时间</option>
                    <option value="teacher">教师不排课时间</option>
                </select>
                <div class="GZ1">
                    <ul>
                        <li><span><i></i><span>@(grade.gradename)</span></span>
                            <div class="GZ1son" id="mainNav_class">
                                <ul>
                                    @*<li style="display: list-item;" data-cid="@(classes[c].id)"><span>@(classes[c].classname)</span></li>*@
                                    <!-- gzbg -->
                                    @if (classes != null)
                                    {
                                        for (int c = 0; c < classes.Count; c++)
                                        {
                                        <li data-cid="@(classes[c].id)">@(classes[c].classname)</li>
                                        }
                                    }
                                </ul>
                            </div>
                        </li>
                    </ul>
                </div>
                <div class="GZ2" id="mainNav_course" style="display: none;">
                    <ul>
                        @if (coureses != null)
                        {   <!-- GZ2bg  -->
                            for (int cos = 0; cos < coureses.Count; cos++)
                            {
                            <li data-cid="@(coureses[cos].id)"><i></i><span>@(coureses[cos].coursename)</span></li>       
                            }
                        }
                    </ul>
                </div>
                <div class="GZ3" style="display: none;">
                    <div class="col-lg-12 col-md-12 col-sm-12">
                        <div class="teacher col-lg-12 col-md-12 col-sm-12">
                            <span>教师</span>
                            <span>课程</span>
                        </div>
                        <div class="teactex col-lg-12 col-md-12 col-sm-12" id="mainNav_teacher">
                            @if (bindList != null)
                            {
                                <!-- active2 -->
                                for (int bb = 0; bb < bindList.Count; bb++)
                                {
                                <p class="col-lg-12 col-md-12 col-sm-12" data-tid="@(bindList[bb].tid)" data-cid="@(bindList[bb].cid)" data-classesCount="@(bindList[bb].classesCount)">
                                    <span>@(bindList[bb].tname)</span>
                                    <span>@(bindList[bb].cname)</span>
                                </p>        
                                }
                            }

                        </div>
                    </div>

                    <div class="fy1">
                        <ul>
                            <li class="page first-page"></li>
                            <li class="page prev-page"></li>
                            <li>|</li>
                            <li>第<span class="actions3">@(page + 1)</span>页</li>
                            <li>|</li>
                            <li>共<span class="totalPageCount">@(totalPageCount)</span>页</li>
                            <li>|</li>
                            <li class="page next-page"></li>
                            <li class="page last-page"></li>
                        </ul>
                    </div>
                </div>

            </div>

            <div class="pkRight col-lg-8 col-md-8 col-sm-12">
                <div class="table-responsive" style="padding-top: 30px;">
                    <table class="table">
                        <thead>
                            <tr>
                                <th>序号</th>
                                @for (int dayofweek = 0; dayofweek < daysofweek; dayofweek++)
                                {
                                    <th>@(DataFormatHelper.WeekStrWithNum(dayofweek))</th>
                                }
                            </tr>
                        </thead>
                        <tbody>
                            @{
                                int allrows = amLessionCount + pmLessionCount;
                                for (int all = 0; all < allrows; all++)
                                {
                                <tr>
                                    <td>@(all + 1)</td>
                                    @for (int cols = 0; cols < daysofweek; cols++)
                                    {
                                        <td class="timetable_avail_td" data-isPK="1" data-id="@(all + 1)_@(cols + 1)"></td>
                                    }
                                </tr>
                                }
                            }
                        </tbody>
                    </table>
                </div>
            </div>
        </div>

    </div>
</div>
<!-- taskId -->
<input type="hidden" id="taskId" value="@(rawTaskid)"/>
<!-- 当前课表一周上几节课 -->
<input type="hidden" id="totalSections" value="@(totalSections)"/>


@section script {
    <script type="text/javascript">
        // 新版js
        $(function () {
            // 老师列表翻页相关
            // 总页码 - 最大页码
            var totalPageIndex = parseInt($(".totalPageCount").text()) - 1;
            var gotoPage;
            $(".page").on("click", function () {
                var $this = $(this);
                // 当前页码
                var currentPageIndex = parseInt($(".actions3").text()) - 1;

                // 第一页
                if ($this.hasClass("first-page")) {
                    gotoPage = 0;
                } else if ($this.hasClass("prev-page")) { // 上一页
                    gotoPage = currentPageIndex == 0 ? currentPageIndex : currentPageIndex - 1;
                } else if ($this.hasClass("next-page")) { // 下一页
                    gotoPage = currentPageIndex == totalPageIndex ? totalPageIndex : currentPageIndex + 1;
                } else {// 最后一页
                    gotoPage = totalPageIndex;
                }

                if (gotoPage == currentPageIndex) return;

                // 翻页
                $.get("TeacherAndClassApi", {
                    taskid: $("#taskId").val(),
                    pageIndex: gotoPage
                }, function (data) {
                    if (data.status) {
                        builderHTMLWithIndex(data.list);
                        $(".actions3").text(gotoPage + 1);
                        // 重新绑定事件
                        teacherPClickReBind();
                    } else {
                        alert(data.info);
                    }
                })
            })

            /// 翻页后的老师&课程数据绑定
            function builderHTMLWithIndex(list) {
                var $tcbody = $(".teactex");
                // var arrayItem = teacherClassArray[index];
                var trStr = "";
                for (var a = 0; a < list.length; a++) {
                    trStr += "<p class='col-lg-12 col-md-12 col-sm-12' data-tid='" + list[a].tid + "' data-cid='" + list[a].cid + "' data-classesCount='" + list[a].classesCount + "'><span>" + list[a].tname + "</span><span>" + list[a].cname + "</span></p>";
                }

                $tcbody.html("");
                $tcbody.html(trStr);

                // bindTeacherClsTrigger();
            }

            // 合班链接
            $(".hb").on("click", function () {
                window.location.href = "MergeClassConfig?taskId=" + $("#taskId").val();
            })

            // 班级选择
            $(".GZ1son ul li").on("click", function () {
                var $this = $(this);
                $this.addClass("active");
                $this.siblings().removeClass("active");
            })
        })
    </script>


    <script type="text/javascript">
        var totalSections = parseInt($("#totalSections").val());
        /// 从当期数组中，找到对应的节点对象
        Array.prototype.findNode = function (type, dataid) {
            for (var i = 0; i < this.length; i++) {
                if (this[i].type == type && this[i].dataId == dataid) {
                    return this[i];
                }
            }

            // 否则创建节点，并返回.
            var node = new NodeConstrutor(type, dataid);
            this.push(node);
            return node;
        }

        /// 创建节点保存对象
        function NodeConstrutor(type, dataId) {
            this.type = type; // 保存节点类型. 老师、课程、班级。
            this.dataId = dataId; // 保存是哪个老师、哪个班级、哪个课程。
            this.nodes = []; // 用户选择的不排序数据。
        }

        // var node = new NodeConstrutor(type, dataid) // 创建节点对象

        // 判断数组中是否包含此对象。
        Array.prototype.contains = function (type, dataid) {

            if (this.length == 0) return false;

            var isContains = false;
            for (var i = 0; i < this.length; i++) {
                if (this[i].type == type && this[i].dataId == dataid) {
                    isContains = true;
                    break;
                }
            }

            return isContains;
        }
        // 判断元素节点在数组中是否存在
        Array.prototype.in_array = function (nodeData) {
            for (var i = 0; i < this.length ; i++) {
                if (this[i] === nodeData) {
                    return true;
                }
            }
            return false;
        }

        var classSelectNode = []; //班级选择节点
        var couresSelectNode = []; // 课程选择节点
        var teacherSelectNode = []; // 老师选择节点

        // 首先加载用户已经存好的不排课数据 , 只是把数据加载集合里。还并未体现在界面上。
        (function loadNoScheduleData() {
            var taskId = $("#taskId").val();
            $.get("getNoScheduleList",
                {
                    taskid: taskId
                },
                function (data) {
                    // class不排课
                    if (data.classList.length > 0) {

                        console.log(data.classList instanceof Array);

                        data.classList.forEach(function (item, index) {
                            var clsNode = new NodeConstrutor("class", item.dataid);
                            item.data.split(',').forEach(function (item2, index2) {
                                clsNode.nodes.push(item2);
                            })

                            classSelectNode.push(clsNode);
                        })
                    }

                    // teacher不排课
                    if (data.teacherList.length > 0) {
                        data.teacherList.forEach(function (teacher, index) {
                            var teaNode = new NodeConstrutor("teacher", teacher.dataid);
                            teacher.data.split(",").forEach(function (datas, index) {
                                teaNode.nodes.push(datas);
                            })

                            teacherSelectNode.push(teaNode);
                        })
                    }

                    // course不排课
                    if (data.courseList.length > 0) {
                        data.courseList.forEach(function (course, index) {
                            var courseNode = new NodeConstrutor("course", course.dataid);
                            course.data.split(",").forEach(function (datas, index) {
                                courseNode.nodes.push(datas);
                            });

                            couresSelectNode.push(courseNode);
                        });
                    }
                })
        })()

        // 如果用户没有选择操作的节点，就提示。不排课必须选择一个节点进行操作。
        function checkHasSelectNode() {
            if (couresSelectNode.length == 0 && teacherSelectNode.length == 0 && classSelectNode.length == 0) {
                alert("请在左侧，选择你需要操作的节点");
                return false; // 取消checkbox的默认选中/取消行为。
            }

            return true;
        }

        ///不排课的操作，1. 点击左侧节点 2. 点击右侧 td.

        $(".table tbody td").on("click", function () {
            // 用户当前操作的面板
            var indexTabStr = $("#unScheduleRuleTypeSlt").find("option:selected").val();

            var operatorNodeArray; // 操作的数组
            var operatorNodeHTML;// 操作的 HTML 结构
            var operatiorNodeIndex;// 操作的索引
            var operatiorNodeType; // 操作的节点类型。

            if (indexTabStr == "class") { // 班级面板
                // 还原用户选择的班级不排课数据

                // 获取自面板索引
                var classLis = $("#mainNav_class ul li");
                var clsINDEX = -1;
                for (var i = 0; i < classLis.length; i++) {
                    if ($(classLis[i]).hasClass("active")) {
                        clsINDEX = i;
                        console.log("classIndex = " + clsINDEX);
                        break;
                    }
                }

                if (clsINDEX == -1) {
                    showFailure("请选择你需要操作的班级数据!");
                    return;
                }

                operatorNodeArray = classSelectNode;
                operatorNodeHTML = classLis;
                operatiorNodeIndex = clsINDEX;
                operatiorNodeType = "class";

            } else if (indexTabStr == "course") { // 课程面板
                // 还原用户选择的课程不排课数据

                // 获取课程面板操作的课程索引
                var selectULIndex = -1;
                var lis = $("#mainNav_course ul li");
                for (var i = 0; i < lis.length; i++) {
                    var $li = $(lis[i]);
                    if ($li.hasClass("GZ2bg")) {
                        selectULIndex = i;
                        console.log("courseIndex = " + i);
                        break;
                    }
                }
                if (selectULIndex == -1) {
                    showFailure("请选择你需要操作的课程数据!");
                    return;
                }
                // alert($("#mainNav_course ul").eq(selectULIndex).find("span[display!=none]").text());
                operatorNodeArray = couresSelectNode;
                operatorNodeHTML = lis;
                operatiorNodeIndex = selectULIndex;
                operatiorNodeType = "course";
            } else { // 老师面板
                // 还原用户选择的老师不排课数据
                var selectTeacherIndex = -1;
                var ps = $("#mainNav_teacher p");
                for (var t = 0; t < ps.length; t++) {
                    var $p = $(ps[t]);
                    if ($p.hasClass("active2")) {
                        selectTeacherIndex = t;
                        console.log("teacherIndex = " + selectTeacherIndex);
                        break;
                    }
                }

                if (selectTeacherIndex == -1) {
                    showFailure("请选择您需要操作的老师数据!");
                    return;
                }

                operatorNodeArray = teacherSelectNode;
                operatorNodeHTML = ps;
                operatiorNodeIndex = selectTeacherIndex;
                operatiorNodeType = "teacher";

                // 2018年04月15日任务。
                // 把课程、老师、班级的数据记录到对应的数组中去。
                // 有2个关键点
                // 1. 不要重复记录数据。
                // 2. 值需要记录不排课的数据，排课的数组不需要记录。(td 排课里面已经包含了位置信息，可以推算出来哪些天的哪节课是不排课的。)
                // ------------------------------------------------------------------------------------------------------
                // 3. 每次切换大 tab，切换小 tab 的时候，都需要将数据还原到表格上。 也就说说，每一个菜单都对应一个“独立”的 table 表格。
                // 4. 最后整理这些记录好的数据，回传到后台，存储到数据库。
                // 5. 当前端数据整理，和后端数据回传存储完成之后。 需要在界面加载的时候，首先从数据库加载这些数据，绑定到界面，并且根据这些数据去刷新每个菜单对应的“独立”的表格。

            }

            var $this = $(this);
            if ($this.index() == 0) return;
            $this.text($this.text() == "不排课" ? "" : "不排课");
            if ($this.text() == "不排课") {
                // 设置成不排课为真标记
                $this.attr("data-isPK", "0");
            } else {
                $this.attr("data-isPK", "1");
            }

            var position = $this.attr("data-id");
            var ispk = $this.attr("data-ispk");
            // 存储格式 1_1_0 = 星期一_第一节课_不排课
            var nodeData = position + "_" + ispk;
            // alert("选中的单元格是 : " + position + " 是否排课 ：" + (ispk == 1 ? "排课" : "不排课"));

            // 获取选中的老师、课程、班级操作的则侧菜单 
            // li -> class ul - course tr - teacher
            var selectedChildMenu = operatorNodeHTML.eq(operatiorNodeIndex);
            if (operatiorNodeType == "class") { // 操作的是班级节点
                // 获取班级信息
                var cid = selectedChildMenu.attr("data-cid");
                var cname = selectedChildMenu.text();
                console.log("当前选中的班级 id : " + cid + "   当前的班级名称 : " + cname);

                var node = operatorNodeArray.findNode("class", cid);

                if (ispk == "0") { // 不排课
                    if (!node.nodes.in_array(nodeData)) {
                        node.nodes.push(nodeData);
                    }
                } else { // 排课
                    node.nodes.pop(nodeData);
                }
                console.log(node.type, node.dataId, node.nodes);
            } else if (operatiorNodeType == "course") { // 操作的是课程节点
                var coursename = selectedChildMenu.find("span").text();
                var courseid = selectedChildMenu.attr("data-cid");

                console.log("当前选中的课程名称 :" + coursename + " 当前课程的 id 是 : " + courseid);

                var node = operatorNodeArray.findNode("course", courseid);
                if (ispk == "0") { // 不排课
                    if (!node.nodes.in_array(nodeData)) {
                        node.nodes.push(nodeData);
                    }
                } else {
                    node.nodes.pop(nodeData);
                }
            } else { // 操作的是老师节点
                // 老师的姓名
                var teachername = selectedChildMenu.find("span").eq(0).text();
                // 老师教的课程名
                var coursename = selectedChildMenu.find("span").eq(1).text();
                // 老师的 id
                var teacherid = selectedChildMenu.attr("data-tid");
                // 课程的 id
                var courseid = selectedChildMenu.attr("data-cid");
                // 此老师的上课节次数
                var classesCount = parseInt(selectedChildMenu.attr("data-classesCount"));

                console.log("老师的姓名 : " + teachername + " teacherid : " + teacherid + " coursename : " + coursename + " courseid : " + courseid);

                var node = operatorNodeArray.findNode("teacher", teacherid);
                if (ispk == "0") { // 不排课
                    if (node.nodes.length + classesCount >= totalSections) {
                        alert("此老师一周至少上 [" + classesCount + "] 节课!");
                        $this.attr("data-isPK", "0");
                        $this.text("");
                        return;
                    }
                    if (!node.nodes.in_array(nodeData)) {
                        node.nodes.push(nodeData);
                    }
                } else {
                    node.nodes.pop(nodeData);
                }

                console.log(node.nodes.length);
            }

        });

        /* 样式的切换 & tableView 数据刷新 */

        //课程样式切换
        $("#mainNav_course ul li").on("click", function () {
            var $li = $(this);
            // if ($li.index() == 0) { $ul.find("span").removeClass("selected_node"); }
            // 班级id
            var cosId = $li.attr("data-cid");
            // var cosType = "courese";// 课程表示类型
            // 当前节点的课程
            var courseData = couresSelectNode.findNode("course", cosId);
            refreshTable(courseData);
        });

        // 班级样式切换
        $("#mainNav_class li").on("click", function () {
            var $li = $(this);
            var clsId = $li.attr("data-cid");
            // 当前班级节点的数据
            var clsData = classSelectNode.findNode("class", clsId);
            refreshTable(clsData);
        });

        // 重新绑定老师p的可以点击事件
        // 老师样式切换
        function teacherPClickReBind() {
            $("#mainNav_teacher p").unbind("click");
            $("#mainNav_teacher p").on("click", function () {
                var $p = $(this);
                var tid = $p.attr("data-tid"); // 老师id
                $p.addClass('active2').siblings().removeClass('active2');
                // 当前老师节点的数据
                var teacherData = teacherSelectNode.findNode("teacher", tid);
                refreshTable(teacherData);
            });
        }
        
        teacherPClickReBind();
      

        /// 根据每个节点已经存储的数据，刷新整个表格
        function refreshTable(data) {
            // 清空整张表格为都排课
            // .timetable_avail_td
            var $tds = $(".table td.timetable_avail_td");
            // $(selector).each(function(index,element))
            $tds.each(function (index, item) {
                $(item).attr("data-ispk", "1"); // 设置成全部排课
                $(item).text(""); // 清空所有的不排课文字。
            })

            // 然后根据节点数据来重新刷新表格哪些cell需要显示不排课
            for (var i = 0; i < data.nodes.length; i++) {
                //1_1_0
                var nodeStr = data.nodes[i];
                var nodePrefix = nodeStr.substring(0, 3);

                $tds.each(function (index, item) {
                    var dataId = $(item).attr("data-id");
                    if (dataId == nodePrefix) {
                        $(item).attr("data-ispk", "1");
                        $(item).text("不排课");
                    }
                });
            }
        }

        /////????????
        //function ampmBind() {
        //    $(".mainTable thead input[type=checkbox]").on("click", function () {
        //        if (!checkHasSelectNode()) return false;
        //        var $this = $(this);
        //        var data = $(this).attr("data-id");
        //        var dataArr = data.split('_');
        //        var dayOfWeek = dataArr[0]; // 0-4 0 表示星期一  4 表示星期五
        //        var amOrPm = dataArr[1]; // 0 上午 1 下午
        //    });
        //}

        //ampmBind();

        /// 从后台获取不排课的数据
        function getGenerateResult() {
            // 用户不排课设置数据提交
            // alert("提价用户设置的数据!");
            // 用户的数据
            /*
                1. 班级选择
                    1.1 每个班级id
                    1.2 每个班级的nodes节点数据
                
                2. 课程选择
                    2.1 每个课程id
                    2.2 每个课程的nodes节点数据

                3. 老师选择
                    3.1 每个老师的id
                    3.2 每个老师的nodes节点数据
            */

            var classPostData = getPostDataWithSelectNode(classSelectNode);
            var coursePostData = getPostDataWithSelectNode(couresSelectNode);
            var teacherPostData = getPostDataWithSelectNode(teacherSelectNode);

            console.log("classPostData : " + classPostData);
            console.log("coursePostData : " + coursePostData);
            console.log("teacherPostData : " + teacherPostData);

            if (classPostData.length == 0 && coursePostData.length == 0 && teacherPostData.length == 0) {
                showFailure("您还未选择不排课数据!");
                return;
            }

            /**
              string taskid, // 任务id
            string classPostData, // 班级不排课数据
            string teacherPostData, // 老师不排课数据
            string coursePostData // 课程不排课数据
            */

            $.ajax({
                type: "POST",
                url: "getScheduleData",
                data: {
                    taskid: $("#taskId").val(),
                    classPostData: classPostData,
                    teacherPostData: teacherPostData,
                    coursePostData: coursePostData
                },
                dataType: "json",
                success: function (data) {
                    console.log(data.status);
                    console.log(data.info);
                    showSuccess(data.info);
                }
            });
        }

        /// 把前端array集合的数据解析成字符串的形式，并准备提交给后台
        function getPostDataWithSelectNode(selectNode) {
            var postData = "";
            if (selectNode.length <= 0) return postData;
            for (var s = 0; s < selectNode.length; s++) {
                // 获取节点
                var node = selectNode[s];
                if (node.nodes.length > 0) {
                    var dataid = node.dataId;
                    postData += dataid + "|";
                    for (var nn = 0; nn < node.nodes.length; nn++) {
                        postData += node.nodes[nn] + ",";
                    }

                    postData = postData.substring(0, postData.length - 1) + "&";
                }
            }

            return postData;
        }
    </script>
}